Conversation
Crawler.Tests/Program.fs
Outdated
| module Program = | ||
|
|
||
| [<EntryPoint>] | ||
| let main _ = 0 |
Lazy.Tests/LazyTests.fs
Outdated
|
|
||
| isEqual | ||
|
|
||
| Check.Quick multiThreadLazyChecker |
There was a problem hiding this comment.
Надо Check.QuickThrowOnFailure
Lazy/Lazy.fs
Outdated
| finally | ||
| Monitor.Exit(lockObj) | ||
|
|
||
| type FreeLockLazy<'a>(supplier: unit -> 'a) = |
There was a problem hiding this comment.
Оно "LockFree" по идее.
Lazy.Tests/LazyTests.fs
Outdated
| for result in results do | ||
| isEqual <- (result = results.[0]) && isEqual | ||
|
|
||
| isEqual |
There was a problem hiding this comment.
А как это доказывает, что supplier вызвался один раз? supplier на все десять прогонов один, возвращает int, так что может вызваться хоть 10 раз, он просто одно и то же число вернёт.
|
|
||
| open System.Threading | ||
|
|
||
| module Lazy = |
There was a problem hiding this comment.
Тут тоже надо комментарии
Lazy/Lazy.fs
Outdated
| value.Value | ||
| | Some x -> x | ||
| finally | ||
| Monitor.Exit(lockObj) |
There was a problem hiding this comment.
Есть библиотечная функция lock, которая делает то же самое. Правильнее её использовать.
Lazy/Lazy.fs
Outdated
|
|
||
| interface ILazy<'a> with | ||
| member this.Get() = | ||
| Monitor.Enter(lockObj) |
There was a problem hiding this comment.
Если брать замок на каждый вызов Get, от такой реализации в многопоточном сценарии никакого толка не будет, потому что все потоки будут обязаны синхронизироваться на Get всегда, тогда как гонка может быть только пока Lazy не инициализирован.
Lazy.Tests/LazyTests.fs
Outdated
|
|
||
| let multiThreadLazy = | ||
| newILazy (fun () -> | ||
| count <- count + 1 |
There was a problem hiding this comment.
Interlocked.Increment. Иначе даже если supplier вызывается много раз, из-за гонки при сложении это может быть не видно.
Lazy/Lazy.fs
Outdated
| interface ILazy<'a> with | ||
| /// <inheritdoc/> | ||
| member this.Get() = | ||
| lock (lockObj) (fun () -> |
There was a problem hiding this comment.
Тут основное замечание было в том, что это избыточный lock, не поправлено
No description provided.